# KNN算法即邻近算法，即根据你的邻居判断你的属性
# 比方说存在一个异常值k=1，当k值与1接近时更有可能取得异常值，判断与异常值的距离使用距离算法（欧氏距离）
# 如果样本在特征空间中有k个最相似样本属于某一类别，则样本也属于此类别
# k值过小时，易受异常点影响，如k=1，离样本最近的恰巧为异常点时，样本被错误归类到异常中
# k值过大时，受样本不均衡的影响，如另一种类都在较大k值所包含中，样本则会被错误归类
# 进行数据预测时，先要进行数据处理，如无量纲化
from sklearn.datasets import load_iris
from sklearn import neighbors
from sklearn.model_selection import train_test_split
from sklearn import preprocessing

if __name__ == "__main__":  # 以下为一个实例，步骤为获取数据，划分数据集，数据处理（标准化），knn算法，模型评估
    iris = load_iris()
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=6)
    standerscaler = preprocessing.StandardScaler()
    x_train = standerscaler.fit_transform(x_train)
    x_test = standerscaler.transform(x_test)
    estimator = neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')  # 前者为邻居数量，后者为距离计算算法
    estimator.fit(x_train, y_train)
    y_predict = estimator.predict(x_test)
    print(y_test, "\n", y_predict)
    score = estimator.score(x_test, y_test)
    print(score)
